package student.aistar.day15.thread01;

import java.util.ArrayList;
import java.util.List;

/**
 * 本类用演示:
 * StringBuilder - 线程非安全的字符串, StringBuffer - 线程安全的字符串
 * ArrayList - 线程非安全的集合, Vector - 线程安全的集合
 * HashMap - 线程非安全的集合, Hashtable - 线程安全的集合
 */
public class SafeThreadDemo {
    public static void main(String[] args) {
        Runnable r = new TS();

        //使用相同接口为参数时, 是共享的资源
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);


        t1.setName("线程0");
        t2.setName("线程1");

        t1.start();
        t2.start();
    }
}
class TS implements Runnable{

    List<Integer> list = new ArrayList<>();
    StringBuffer stringBuffer = new StringBuffer();

    //如果ArrayList - add方法 -> 两个线程同时增加时, 第一个增加成功时,但成功后, 数据满了
    //当第二个线程想继续添加的时候, 会直接报错, 数组下标越界

    //Vector - remove方法[synchronized] -> 只能有一个线程进去扣钱 -> 只能被一个线程成功扣款

    //线程安全的类

    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }

            //第一种①: 有可能第一个线程添加的快点, 所以可以很快的输出size大小为10,
            //但是有可能和另一个线程同时添加, 所以第一个线程的size是不确定因素

            //第二种②: 有可能两个线程添加的都很慢, 所以后面输出的都是20
            list.add(i);
//            stringBuffer.append(i);
//            System.out.println(i);
            //System.out.println(Thread.currentThread().getName() + ":  " + stringBuffer.length());
//            System.out.println(stringBuffer.length());
        }
        System.out.println(Thread.currentThread().getName() + ":  " + list.size());
//        System.out.println(Thread.currentThread().getName() + "特俗:  " + stringBuffer.length());
    }

}